#include <stdint.h>
#include <d3d12.h>
#include <DXGI1_4.h>
#include "GraphicsManager.hpp"

namespace My 
{
    class D3d12GraphicsManager : public GraphicsManager
    {
    public:
        virtual int Initialize() override;
        virtual void Finalize() override;
        virtual void Tick() override;

    public:
        // 创建渲染目标
        HRESULT CreateRenderTarget();

        // 初始化渲染管线
        HRESULT InitPipeline();

        // 创建图形资源
        HRESULT CreateGraphicsResources();

    private:
        static const uint32_t       kFrameCount = 2;
        ID3D12Device*               m_pDev = nullptr;               // 指向Direct3d设备接口的指针
        D3D12_VIEWPORT              m_ViewPort;                     // 视口结构体，定义了渲染区域的大小和位置
        D3D12_RECT                  m_ScissorRect;                  // 裁剪矩形结构体，用于定义渲染的裁剪区域
        IDXGISwapChain3*            m_pSwapChain = nullptr;         // 交换链接口的指针，用于管理窗口的前后缓冲区
        ID3D12Resource*             m_pRenderTargets[kFrameCount];  // 渲染目标资源数组
        ID3D12CommandAllocator*     m_pCommandAllocator = nullptr;  // 命令分配器指针，用于分配命令列表
        ID3D12CommandQueue*         m_pCommandQueue = nullptr;      // 命令队列，用于提交命令列表到gpu
        ID3D12RootSignature*        m_pRootSignature = nullptr;     // 根签名，定义了渲染管线的资源绑定
        ID3D12DescriptorHeap*       m_pRtvHeap = nullptr;           // 描述符堆，一个描述gpu对象的数组，用于存储渲染目标视图等描述符
        ID3D12PipelineState*        m_pPipelineState = nullptr;     // 管线状态，维护当前设置的着色器和固定功能状态对象
        ID3D12GraphicsCommandList*  m_pCommandList = nullptr;       // 图形命令列表，用于存储将要提交给GPU执行的命令

        uint32_t                    m_nRtvDescriptorSize;           // 渲染目标视图描述符的大小

        ID3D12Resource*             m_pVertexBuffer = nullptr;      // 顶点缓冲区资源
        D3D12_VERTEX_BUFFER_VIEW    m_VertexBufferView;             // 顶点缓冲区视图

        // 同步对象
        uint32_t                    m_nFrameIndex;                  // 当前帧索引
        HANDLE                      m_hFenceEvent;                  // 同步时间的句柄
        ID3D12Fence*                m_pFence = nullptr;             // 同步屏障
        uint32_t                    m_nFenceValue;                  // 同步屏障的值
    };
}